package com.bjsxt.userscenter.users.service.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.alibaba.dubbo.rpc.RpcContext;
import com.alibaba.fastjson.JSONObject;
import com.bjsxt.userscenter.common.util.ConstatFinalUtil;
import com.bjsxt.userscenter.common.util.PageInfoUtil;
import com.bjsxt.userscenter.users.dao.IAAdminsDao;
import com.bjsxt.userscenter.users.dao.IARoleDao;
import com.bjsxt.userscenter.users.pojo.AAdmins;
import com.bjsxt.userscenter.users.pojo.ARole;
import com.bjsxt.userscenter.users.service.IUsersService;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;

/**
 * 用户Service的实现类
 * @author WangshSxt
 *
 */
@Service("usersService")
public class UsersServiceImpl implements IUsersService
{
	@Resource
	private IAAdminsDao adminsDao;
	@Resource
	private IARoleDao roleDao;
	
	@Override
	public JSONObject saveOneAdminsService(AAdmins admins)
	{
		JSONObject resultJSON = new JSONObject() ; 
		
		/* 按照用户名查询管理员 */
		Map<String, Object> condMap = new HashMap<String, Object>();
		condMap.put("email", admins.getEmail());
		AAdmins adminsRes = this.findOneAdminsService(condMap);
		if(adminsRes != null)
		{
			resultJSON.put("code", "2");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("2"));
			return resultJSON ; 
		}
		
		int res =  this.adminsDao.save(admins);
		
		/*String str = null ; 
		str.toString() ; */
		
		if(res > 0 )
		{
			/* 成功 */
			resultJSON.put("code", "0");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("0"));
			
			JSONObject dataJSON = new JSONObject() ; 
			/* id */
			dataJSON.put("id", admins.getId());
			/* 影响的条数 */
			dataJSON.put("effect", res);
			
			resultJSON.put("data", dataJSON);
		}else
		{
			/* 失败 */
			resultJSON.put("code", "1");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("1"));
		}
		return resultJSON ; 
	}

	@Override
	public AAdmins findOneAdminsService(Map<String, Object> condMap)
	{
		return this.adminsDao.findOne(condMap);
	}

	@Override
	public JSONObject updateOneAdminsService(AAdmins admins)
	{
		JSONObject resultJSON = new JSONObject() ; 
		
		/*
		 * 修改的时候,邮箱不能重复
		 * 先查询一遍,如何做?
		 * ~正常的更新,邮箱不更新,下面的情况成立吗
		 * 
		 * HeadController
		 * if(res > 0 )
		 * {
		 *  成功
		 * }else
		 * {
		 *  失败
		 * }
		 * 
		 * BackController
		 * if(res > 0 )
		 * {
		 *  成功
		 * }else
		 * {
		 *  失败
		 * }
		 * 
		 * */
		/* 按照用户名查询管理员 */
		Map<String, Object> condMap = new HashMap<String, Object>();
		condMap.put("email", admins.getEmail());
		AAdmins adminsRes = this.findOneAdminsService(condMap);
		if(adminsRes != null && adminsRes.getId() != admins.getId())
		{
			/* 什么情况下,进入到此代码
			 * 输入的邮箱和其它邮箱一致的时候才进入到这里面
			 * ~根据邮箱肯定可以查询出结果
			 * ~查询出的结果(adminsRes)不是自己(参数中的对象)_(admins),只要两个id不一样
			 *  */
			resultJSON.put("code", "2");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("2"));
			return resultJSON ; 
		}
		
		int res =  this.adminsDao.update(admins);
		
		if(res > 0 )
		{
			/* 成功 */
			resultJSON.put("code", "0");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("0"));
			
			JSONObject dataJSON = new JSONObject() ; 
			/* id */
			dataJSON.put("id", admins.getId());
			/* 影响的条数 */
			dataJSON.put("effect", res);
			
			resultJSON.put("data", dataJSON);
		}else
		{
			/* 失败 */
			resultJSON.put("code", "1");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("1"));
		}
		return resultJSON ; 
	}

	@Override
	public JSONObject deleteOneAdminsService(Map<String, Object> condMap)
	{
		JSONObject resultJSON = new JSONObject() ; 
		int res =  this.adminsDao.delete(condMap);
		
		if(res > 0 )
		{
			/* 成功 */
			resultJSON.put("code", "0");
			resultJSON.put("info", "成功");
			
			JSONObject dataJSON = new JSONObject() ; 
			/* 影响的条数 */
			dataJSON.put("effect", res);
			
			resultJSON.put("data", dataJSON);
		}else
		{
			/* 失败 */
			resultJSON.put("code", "1");
			resultJSON.put("info", "失败");
		}
		return resultJSON ; 
	}

	/**
	 * 实现了分页功能
	 * 实现了查询多条,不分页的功能
	 * 如何让两种情况并存,都支持
	 * 
	 * ~Page这个对象和Mybatis插件绑定紧密
	 * ~将来如果换成其它的dao框架,分页就无法使用
	 * ~所有在jsp页面上写的代码都要改(Page里面的属性和其它框架的分页方法的属性不一样)
	 * 
	 * ~要想分页,有两个必备条件????
	 * ~总条数,每页多少条
	 */
	@Override
	public Map<String,Object> findCondListAdminsService(PageInfoUtil pageInfoUtil,Map<String,Object> condMap)
	{
		Map<String, Object> resultMap = new HashMap<String, Object>();
		/* 处理关键字的模糊匹配 */
		if(condMap.get("keyword") != null)
		{
			condMap.put("keyword", "%" + condMap.get("keyword") +  "%");
		}
		if(pageInfoUtil != null)
		{
			/* 分页查询 */
			Page page = PageHelper.startPage(pageInfoUtil.getCurrentPage(), pageInfoUtil.getPageSize());
			List<AAdmins> adminsList = this.adminsDao.findList(condMap);
			/* 分页的两个要素 */
			/* 分页的总记录数 */
			/*pageInfoUtil.setTotalRecord(Integer.valueOf(page.getTotal() + ""));*/
			pageInfoUtil.setTotalRecord(Long.valueOf(page.getTotal()).intValue());
			
			/* 设置值 */
			condMap.put("totalRecord", pageInfoUtil.getTotalRecord());
			/* 生产者消费者存储数据 */
			RpcContext rpcContext = RpcContext.getContext() ; 
			rpcContext.setAttachment("totalRecord", pageInfoUtil.getTotalRecord() + "");
			rpcContext.set("totalRecord", pageInfoUtil.getTotalRecord() + "");
			
			resultMap.put("list", adminsList);
			resultMap.put("totalRecord", pageInfoUtil.getTotalRecord());
			resultMap.put("pageInfoUtil", pageInfoUtil);
			return resultMap ; 
		}
		List<AAdmins> adminsList = this.adminsDao.findList(condMap) ; 
		resultMap.put("list", adminsList);
		return resultMap;
	}

	@Override
	public JSONObject saveOneRoleService(ARole role)
	{
		JSONObject resultJSON = new JSONObject() ; 
		int res =  this.roleDao.save(role);
		
		/*String str = null ; 
		str.toString() ; */
		
		if(res > 0 )
		{
			/* 成功 */
			resultJSON.put("code", "0");
			resultJSON.put("info", "成功");
			
			JSONObject dataJSON = new JSONObject() ; 
			/* id */
			dataJSON.put("id", role.getId());
			/* 影响的条数 */
			dataJSON.put("effect", res);
			
			resultJSON.put("data", dataJSON);
		}else
		{
			/* 失败 */
			resultJSON.put("code", "1");
			resultJSON.put("info", "失败");
		}
		return resultJSON ; 
	}

	@Override
	public ARole findOneRoleService(Map<String, Object> condMap)
	{
		return this.roleDao.findOne(condMap);
	}

	@Override
	public JSONObject updateOneRoleService(ARole role)
	{
		JSONObject resultJSON = new JSONObject() ; 
		int res =  this.roleDao.update(role);
		
		if(res > 0 )
		{
			/* 成功 */
			resultJSON.put("code", "0");
			resultJSON.put("info", "成功");
			
			JSONObject dataJSON = new JSONObject() ; 
			/* id */
			dataJSON.put("id", role.getId());
			/* 影响的条数 */
			dataJSON.put("effect", res);
			
			resultJSON.put("data", dataJSON);
		}else
		{
			/* 失败 */
			resultJSON.put("code", "1");
			resultJSON.put("info", "失败");
		}
		return resultJSON ; 
	}

	@Override
	public JSONObject deleteOneRoleService(Map<String, Object> condMap)
	{
		JSONObject resultJSON = new JSONObject() ; 
		int res =  this.roleDao.delete(condMap);
		
		if(res > 0 )
		{
			/* 成功 */
			resultJSON.put("code", "0");
			resultJSON.put("info", "成功");
			
			JSONObject dataJSON = new JSONObject() ; 
			/* 影响的条数 */
			dataJSON.put("effect", res);
			
			resultJSON.put("data", dataJSON);
		}else
		{
			/* 失败 */
			resultJSON.put("code", "1");
			resultJSON.put("info", "失败");
		}
		return resultJSON ; 
	}

	/**
	 * 实现了分页功能
	 * 实现了查询多条,不分页的功能
	 * 如何让两种情况并存,都支持
	 * 
	 * ~Page这个对象和Mybatis插件绑定紧密
	 * ~将来如果换成其它的dao框架,分页就无法使用
	 * ~所有在jsp页面上写的代码都要改(Page里面的属性和其它框架的分页方法的属性不一样)
	 * 
	 * ~要想分页,有两个必备条件????
	 * ~总条数,每页多少条
	 */
	@Override
	public List<ARole> findCondListRoleService(PageInfoUtil pageInfoUtil,Map<String,Object> condMap)
	{
		/* 处理关键字的模糊匹配 */
		if(condMap.get("keyword") != null)
		{
			condMap.put("keyword", "%" + condMap.get("keyword") +  "%");
		}
		if(pageInfoUtil != null)
		{
			/* 分页查询 */
			Page page = PageHelper.startPage(pageInfoUtil.getCurrentPage(), pageInfoUtil.getPageSize());
			List<ARole> roleList = this.roleDao.findList(condMap);
			/* 分页的两个要素 */
			/* 分页的总记录数 */
			/*pageInfoUtil.setTotalRecord(Integer.valueOf(page.getTotal() + ""));*/
			pageInfoUtil.setTotalRecord(Long.valueOf(page.getTotal()).intValue());
			return roleList ; 
		}
		return this.roleDao.findList(condMap);
	}
}
